Tutustu, miten Service Workerit sieppaavat sivulatauspyyntöjä, mahdollistaen välimuististrategiat, offline-toiminnallisuuden ja paremman suorituskyvyn nykyaikaisille verkkosovelluksille.
Frontend Service Worker -navigointi: Sivulatausten sieppaaminen parannetun käyttäjäkokemuksen saavuttamiseksi
Service Workerit ovat tehokas teknologia, joka mahdollistaa verkkopyyntöjen sieppaamisen, resurssien tallentamisen välimuistiin ja offline-toiminnallisuuden tarjoamisen verkkosovelluksille. Yksi vaikuttavimmista ominaisuuksista on sivulatauspyyntöjen sieppaaminen, mikä mahdollistaa suorituskyvyn ja käyttäjäkokemuksen dramaattisen parantamisen. Tämä artikkeli tutkii, kuinka Service Workerit käsittelevät navigointipyyntöjä, tarjoten käytännön esimerkkejä ja toimivia oivalluksia kehittäjille.
Navigointipyyntöjen ymmärtäminen
Ennen koodiin sukeltamista, määritellään mitä "navigointipyyntö" tarkoittaa Service Workerien kontekstissa. Navigointipyyntö on pyyntö, jonka käyttäjä käynnistää siirtyessään uudelle sivulle tai päivittäessään nykyisen sivun. Nämä pyynnöt laukaistaan tyypillisesti:
- Klikkaamalla linkkiä (
<a>-tagi) - Kirjoittamalla URL-osoitteen osoiteriville
- Päivittämällä sivun
- Käyttämällä selaimen edellinen- tai seuraava-painikkeita
Service Workereilla on kyky siepata nämä navigointipyynnöt ja määrittää, miten ne käsitellään. Tämä avaa mahdollisuuksia monimutkaisten välimuististrategioiden toteuttamiseen, sisällön tarjoamiseen välimuistista käyttäjän ollessa offline-tilassa ja jopa sivujen dynaamiseen generointiin asiakaspäässä.
Service Workerin rekisteröiminen
Ensimmäinen askel on rekisteröidä Service Worker. Tämä tehdään tyypillisesti pää-JavaScript-tiedostossasi:
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/service-worker.js')
.then(registration => {
console.log('Service Worker rekisteröity skoopilla:', registration.scope);
})
.catch(error => {
console.error('Service Workerin rekisteröinti epäonnistui:', error);
});
}
Tämä koodi tarkistaa, tukeeko selain Service Workereita, ja jos tukee, se rekisteröi /service-worker.js-tiedoston. Varmista, että tämä JavaScript suoritetaan turvallisessa kontekstissa (HTTPS) tuotantoympäristöissä.
Navigointipyyntöjen sieppaaminen Service Workerissa
service-worker.js-tiedostosi sisällä voit kuunnella fetch-tapahtumaa. Tämä tapahtuma laukeaa jokaisesta sovelluksesi tekemästä verkkopyynnöstä, mukaan lukien navigointipyynnöt. Voimme suodattaa näitä pyyntöjä käsitelläksemme nimenomaan navigointipyyntöjä.
self.addEventListener('fetch', event => {
if (event.request.mode === 'navigate') {
event.respondWith(async () => {
try {
// Yritä ensin käyttää navigation preload -vastausta, jos sitä tuetaan.
const preloadResponse = await event.preloadResponse;
if (preloadResponse) {
return preloadResponse;
}
// Yritä aina ensin verkkoa.
const networkResponse = await fetch(event.request);
return networkResponse;
} catch (error) {
// catch laukeaa vain, jos poikkeus heitetään, mikä on todennäköisesti
// verkkoyhteysvirheen seurausta.
// Jos HTML-tiedoston nouto epäonnistuu, etsi varavaihtoehto.
console.log('Nouto epäonnistui; palautetaan offline-sivu.', error);
const cache = await caches.open(CACHE_NAME);
const cachedResponse = await cache.match(OFFLINE_URL);
return cachedResponse || createErrorResponse(); // Varavaihtoehto, jos offline-sivu ei ole saatavilla
}
});
}
});
Käydään tämä koodi läpi:
event.request.mode === 'navigate': Tämä ehto tarkistaa, onko pyyntö navigointipyyntö.event.respondWith(): Tämä metodi kertoo selaimelle, miten pyyntö käsitellään. Se ottaa vastaan lupauksen (promise), joka ratkeaaResponse-objektiksi.event.preloadResponse: Tämä on mekanismi nimeltä Navigation Preload. Jos se on käytössä, se antaa selaimen aloittaa navigointipyynnön noutamisen ennen kuin Service Worker on täysin aktiivinen. Se parantaa nopeutta limittämällä Service Workerin käynnistysajan verkkopyynnön kanssa.fetch(event.request): Tämä noutaa resurssin verkosta. Jos verkko on saatavilla, sivu latautuu palvelimelta normaalisti.caches.open(CACHE_NAME): Tämä avaa välimuistin määritetyllä nimellä (CACHE_NAMEtäytyy olla määriteltynä muualla Service Worker -tiedostossasi).cache.match(OFFLINE_URL): Tämä etsii välimuistista vastausta, joka vastaaOFFLINE_URL-osoitetta (esim. offline-sivu).createErrorResponse(): Tämä on mukautettu funktio, joka palauttaa virhevastauksen. Voit mukauttaa tätä funktiota tarjotaksesi käyttäjäystävällisen offline-kokemuksen.
Välimuististrategiat navigointipyynnöille
Edellinen esimerkki esittelee perus network-first-strategian. Voit kuitenkin toteuttaa monimutkaisempia välimuististrategioita sovelluksesi vaatimusten mukaan.
Verkko ensin, varalla välimuisti
Tämä on edellisessä esimerkissä esitetty strategia. Se yrittää noutaa resurssin ensin verkosta. Jos verkkopyyntö epäonnistuu (esim. käyttäjä on offline-tilassa), se turvautuu välimuistiin. Tämä on hyvä strategia usein päivitettävälle sisällölle.
Välimuisti ensin, päivitys taustalla
Tämä strategia tarkistaa välimuistin ensin. Jos resurssi löytyy välimuistista, se palautetaan välittömästi. Taustalla Service Worker päivittää välimuistin uusimmalla versiolla resurssista verkosta. Tämä tarjoaa nopean alkulatauksen ja varmistaa, että käyttäjällä on lopulta aina uusin sisältö.
self.addEventListener('fetch', event => {
if (event.request.mode === 'navigate') {
event.respondWith(
caches.match(event.request)
.then(cachedResponse => {
if (cachedResponse) {
// Päivitä välimuisti taustalla.
event.waitUntil(
fetch(event.request).then(response => {
return caches.open(CACHE_NAME).then(cache => {
return cache.put(event.request, response.clone());
});
})
);
return cachedResponse;
}
// Jos ei löydy välimuistista, nouda verkosta.
return fetch(event.request);
})
);
}
});
Vain välimuisti
Tämä strategia tarjoaa sisältöä vain välimuistista. Jos resurssia ei löydy välimuistista, pyyntö epäonnistuu. Tämä sopii resursseille, joiden tiedetään olevan staattisia ja saatavilla offline-tilassa.
Stale-While-Revalidate
Samanlainen kuin Cache First, mutta sen sijaan että päivitettäisiin taustalla event.waitUntil-metodilla, palautat välittömästi välimuistissa olevan vastauksen (jos saatavilla) ja *aina* yrität noutaa uusimman version verkosta ja päivittää välimuistin. Tämä lähestymistapa tarjoaa erittäin nopean alkulatauksen, koska käyttäjä saa välimuistissa olevan version välittömästi, mutta se takaa, että välimuisti päivittyy lopulta tuoreimmalla datalla seuraavaa pyyntöä varten. Tämä on erinomainen ei-kriittisille resursseille tai tilanteisiin, joissa hieman vanhentuneen tiedon näyttäminen hetkellisesti on hyväksyttävää nopeuden vastineeksi.
self.addEventListener('fetch', event => {
if (event.request.mode === 'navigate') {
event.respondWith(
caches.open(CACHE_NAME).then(cache => {
return cache.match(event.request).then(cachedResponse => {
const fetchedResponse = fetch(event.request).then(networkResponse => {
cache.put(event.request, networkResponse.clone());
return networkResponse;
});
// Palauta välimuistissa oleva vastaus, jos meillä on se, muuten odota
// verkkoa.
return cachedResponse || fetchedResponse;
});
})
);
}
});
Navigation Preload
Navigation Preload on ominaisuus, joka antaa selaimen aloittaa resurssin noutamisen ennen kuin Service Worker on täysin aktiivinen. Tämä voi merkittävästi parantaa navigointipyyntöjen suorituskykyä, erityisesti sivustosi ensimmäisellä vierailukerralla.
Ottaksesi Navigation Preloadin käyttöön, sinun tulee:
- Ottaa se käyttöön Service Workerisi
activate-tapahtumassa. - Tarkistaa
preloadResponsefetch-tapahtumassa.
// activate-tapahtumassa:
self.addEventListener('activate', event => {
event.waitUntil(self.registration.navigationPreload.enable());
});
// fetch-tapahtumassa (kuten alkuperäisessä esimerkissä näytettiin):
self.addEventListener('fetch', event => {
if (event.request.mode === 'navigate') {
event.respondWith(async () => {
const preloadResponse = await event.preloadResponse;
if (preloadResponse) {
return preloadResponse;
}
// ... loput noutologiikastasi ...
});
}
});
Offline-tilanteiden käsittely
Yksi Service Workerien käytön ensisijaisista eduista on kyky tarjota offline-toiminnallisuutta. Kun käyttäjä on offline-tilassa, voit tarjota välimuistiin tallennetun version sovelluksestasi tai näyttää mukautetun offline-sivun.
Käsitelläksesi offline-tilanteita, sinun tulee:
- Tallentaa tarvittavat resurssit välimuistiin, mukaan lukien HTML, CSS, JavaScript ja kuvat.
fetch-tapahtumassa siepata kaikki verkkovirheet ja tarjota välimuistista offline-sivu.
// Määritä offline-sivun URL ja välimuistin nimi
const OFFLINE_URL = '/offline.html';
const CACHE_NAME = 'my-app-cache-v1';
// Install-tapahtuma: tallenna staattiset resurssit välimuistiin
self.addEventListener('install', event => {
event.waitUntil(
caches.open(CACHE_NAME).then(cache => {
return cache.addAll([
'/',
'/index.html',
'/style.css',
'/app.js',
OFFLINE_URL // Tallenna offline-sivu välimuistiin
]);
})
);
self.skipWaiting(); // Aktivoi service worker välittömästi
});
// Fetch-tapahtuma: käsittele navigointipyynnöt ja offline-varavaihtoehto
self.addEventListener('fetch', event => {
if (event.request.mode === 'navigate') {
event.respondWith(async () => {
try {
// Yritä ensin käyttää navigation preload -vastausta, jos sitä tuetaan.
const preloadResponse = await event.preloadResponse;
if (preloadResponse) {
return preloadResponse;
}
// Yritä aina ensin verkkoa.
const networkResponse = await fetch(event.request);
return networkResponse;
} catch (error) {
// catch laukeaa vain, jos poikkeus heitetään, mikä on todennäköisesti
// verkkoyhteysvirheen seurausta.
// Jos HTML-tiedoston nouto epäonnistuu, etsi varavaihtoehto.
console.log('Nouto epäonnistui; palautetaan offline-sivu.', error);
const cache = await caches.open(CACHE_NAME);
const cachedResponse = await cache.match(OFFLINE_URL);
return cachedResponse || createErrorResponse(); // Varavaihtoehto, jos offline-sivu ei ole saatavilla
}
});
}
});
function createErrorResponse() {
return new Response(
`Offline-tilassa
Olet tällä hetkellä offline-tilassa. Tarkista internet-yhteytesi.
`, {
headers: { 'Content-Type': 'text/html' }
}
);
}
Tämä koodi tallentaa offline.html-sivun välimuistiin install-tapahtuman aikana. Sitten fetch-tapahtumassa, jos verkkopyyntö epäonnistuu (catch-lohko suoritetaan), se tarkistaa välimuistista offline.html-sivun ja palauttaa sen selaimelle.
Edistyneet tekniikat ja huomiot
Cache Storage API:n suora käyttö
caches-objekti tarjoaa tehokkaan API:n välimuistissa olevien vastausten hallintaan. Voit käyttää metodeja, kuten cache.put(), cache.match() ja cache.delete(), manipuloidaksesi välimuistia suoraan. Tämä antaa sinulle hienojakoisen hallinnan siitä, miten resursseja tallennetaan ja noudetaan.
Dynaaminen välimuisti
Staattisten resurssien välimuistiin tallentamisen lisäksi voit myös tallentaa dynaamista sisältöä, kuten API-vastauksia. Tämä voi merkittävästi parantaa sovelluksesi suorituskykyä, erityisesti käyttäjillä, joilla on hidas tai epäluotettava internetyhteys.
Välimuistin versiointi
On tärkeää versioida välimuistisi, jotta voit päivittää välimuistissa olevat resurssit, kun sovelluksesi muuttuu. Yleinen lähestymistapa on sisällyttää versionumero CACHE_NAME-muuttujaan. Kun päivität sovelluksesi, voit kasvattaa versionumeroa, mikä pakottaa selaimen lataamaan uudet resurssit.
const CACHE_NAME = 'my-app-cache-v2'; // Kasvata versionumeroa
Sinun on myös poistettava vanhat välimuistit estääksesi niiden kerääntymisen ja tallennustilan tuhlaamisen. Voit tehdä tämän activate-tapahtumassa.
self.addEventListener('activate', event => {
const cacheWhitelist = [CACHE_NAME];
event.waitUntil(
caches.keys().then(cacheNames => {
return Promise.all(
cacheNames.map(cacheName => {
if (cacheWhitelist.indexOf(cacheName) === -1) {
return caches.delete(cacheName);
}
})
);
})
);
});
Background Sync
Service Workerit tarjoavat myös Background Sync API:n, joka antaa sinun lykätä tehtäviä, kunnes käyttäjällä on vakaa internetyhteys. Tämä on hyödyllistä tilanteissa, kuten lomakkeiden lähettämisessä tai tiedostojen lataamisessa käyttäjän ollessa offline-tilassa.
Push-ilmoitukset
Service Workereita voidaan käyttää myös push-ilmoitusten toteuttamiseen, mikä mahdollistaa viestien lähettämisen käyttäjillesi, vaikka he eivät aktiivisesti käyttäisikään sovellustasi. Tätä voidaan käyttää ilmoittamaan käyttäjille uudesta sisällöstä, päivityksistä tai tärkeistä tapahtumista.
Kansainvälistämisen (i18n) ja lokalisoinnin (L10n) huomioiminen
Kun toteutat Service Workereita globaalissa sovelluksessa, on ratkaisevan tärkeää ottaa huomioon kansainvälistäminen (i18n) ja lokalisointi (L10n). Tässä on joitain keskeisiä näkökohtia:
- Kielen tunnistus: Toteuta mekanismi käyttäjän ensisijaisen kielen tunnistamiseksi. Tämä voi sisältää
Accept-LanguageHTTP-otsakkeen, käyttäjäasetuksen tai selain-API:den käytön. - Lokalisoitu sisältö: Tallenna lokalisoidut versiot offline-sivuistasi ja muusta välimuistiin tallennetusta sisällöstä. Käytä tunnistettua kieltä tarjotaksesi oikean version. Voit esimerkiksi pitää erilliset offline-sivut englanniksi (
/offline.en.html), espanjaksi (/offline.es.html) ja ranskaksi (/offline.fr.html). Service Workerisi valitsisi sitten dynaamisesti oikean tiedoston tallennettavaksi ja tarjottavaksi käyttäjän kielen perusteella. - Päivämäärän ja ajan muotoilu: Varmista, että kaikki offline-sivuillasi näytettävät päivämäärät ja ajat on muotoiltu käyttäjän aluekohtaisten asetusten mukaisesti. Käytä tähän tarkoitukseen JavaScriptin
Intl-API:a. - Valuutan muotoilu: Jos sovelluksesi näyttää valuutta-arvoja, muotoile ne käyttäjän aluekohtaisten asetusten ja valuutan mukaan. Käytä jälleen
Intl-API:a valuutan muotoiluun. - Tekstin suunta: Huomioi kielet, jotka luetaan oikealta vasemmalle (RTL), kuten arabia ja heprea. Offline-sivujesi ja välimuistiin tallennetun sisällön tulisi tukea RTL-tekstin suuntaa CSS:n avulla.
- Resurssien lataaminen: Lataa dynaamisesti lokalisoituja resursseja (esim. kuvia, fontteja) käyttäjän kielen perusteella.
Esimerkki: Lokalisoidun offline-sivun valinta
// Funktio käyttäjän ensisijaisen kielen saamiseksi
function getPreferredLanguage() {
// Tämä on yksinkertaistettu esimerkki. Oikeassa sovelluksessa
// käyttäisit vankempaa kielen tunnistusmekanismia.
return navigator.language || navigator.userLanguage || 'en';
}
// Määritä vastaavuus kielten ja offline-sivujen URL-osoitteiden välillä
const offlinePageUrls = {
'en': '/offline.en.html',
'es': '/offline.es.html',
'fr': '/offline.fr.html'
};
// Hae käyttäjän ensisijainen kieli
const preferredLanguage = getPreferredLanguage();
// Määritä offline-sivun URL ensisijaisen kielen perusteella
let offlineUrl = offlinePageUrls[preferredLanguage] || offlinePageUrls['en']; // Oletuksena englanti, jos vastaavuutta ei löydy
// ... loput service worker -koodistasi, käyttäen offlineUrl-muuttujaa oikean offline-sivun tallentamiseen ja tarjoamiseen ...
Testaus ja virheenjäljitys
Service Workerien testaaminen ja virheenjäljitys voi olla haastavaa. Tässä muutamia vinkkejä:
- Käytä Chrome DevToolsia: Chrome DevTools tarjoaa oman paneelin Service Workerien tarkasteluun. Voit käyttää tätä paneelia nähdäksesi Service Workerisi tilan, tarkastella välimuistiin tallennettuja resursseja ja jäljittää verkkopyyntöjä.
- Käytä Service Worker Update on Reload -toimintoa: Chrome DevTools -> Application -> Service Workers -välilehdellä voit valita "Update on reload" pakottaaksesi service workerin päivittymään jokaisen sivun uudelleenlatauksen yhteydessä. Tämä on erittäin hyödyllistä kehityksen aikana.
- Tyhjennä tallennustila: Joskus Service Worker voi joutua huonoon tilaan. Selaimen tallennustilan (mukaan lukien välimuistin) tyhjentäminen voi auttaa ratkaisemaan näitä ongelmia.
- Käytä Service Worker -testauskirjastoa: Saatavilla on useita kirjastoja, jotka voivat auttaa sinua testaamaan Service Workereitasi, kuten Workbox.
- Testaa oikeilla laitteilla: Vaikka voit testata Service Workereita työpöytäselaimessa, on tärkeää testata niitä oikeilla mobiililaitteilla varmistaaksesi, että ne toimivat oikein erilaisissa verkkoolosuhteissa.
Yhteenveto
Sivulatauspyyntöjen sieppaaminen Service Workereilla on tehokas tekniikka verkkosovellusten käyttäjäkokemuksen parantamiseksi. Toteuttamalla välimuististrategioita, tarjoamalla offline-toiminnallisuutta ja optimoimalla verkkopyyntöjä voit merkittävästi parantaa suorituskykyä ja sitoutumista. Muista ottaa huomioon kansainvälistäminen, kun kehität globaalille yleisölle, varmistaaksesi yhtenäisen ja käyttäjäystävällisen kokemuksen kaikille.
Tämä opas tarjoaa vankan perustan Service Worker -navigoinnin sieppaamisen ymmärtämiseen ja toteuttamiseen. Kun jatkat tämän teknologian tutkimista, löydät vielä enemmän tapoja hyödyntää sen ominaisuuksia luodaksesi poikkeuksellisia verkkokokemuksia.